module.exports = {
    // 依赖的MySQL服务(docker容器)相关配置
    mysql: {
        // 服务端口，默认为3377
        port: 3377,
        // mysql root密码
        pootPassword: "prisma",
    },

    // 依赖的Prisma服务(docker容器)相关配置
    prisma: {
        // 服务端口，默认为4477
        port: 4477,
    },

    // 是否开启区块数据同步功能，以从RepChain网络获取区块数据
    // 默认开启
    enableSync: true,

    // 区块链组网标识，可配置多个以推送多个区块链组网内的区块数据
    networks: [
        {
            // 该区块链组网的唯一标识
            id: "identity-net",

            // 该区块链组网内的节点地址
            // 可配置多个节点，以防单个节点失效或网络故障无法访问，程序将自动访问可连接的节点以获取区块数据
            // 其中url_subscribe表示节点的websocket api url，url_api表示节点的一般rest api url
            peers: [
                {
                    url_subscribe: "ws://localhost:9081/event",
                    url_api: "http://localhost:9081",
                }
            ],
        },
        // {
        //     id: "credence-net",
        //     peers: [
        //         {
        //             url_subscribe: "ws://localhost:8081/event",
        //             url_api: "http://localhost:8081",
        //         }
        //     ]
        // } 
    ],

    // 状态检查服务API: GET /status
    // 默认端口8008
    statusPort: 8008,

    // 订阅设置, 可配置多个订阅者，将分别被推送区块数据
    subscribers: [
        {
            // 订阅者名称，作为订阅者的唯一标识
            name: "subscriber1",

            // 所订阅的链组网的标识，可为多个
            // 订阅多个时将同时向相应的多个链组网订阅数据
            networkIds: ["identity-net"],

            // 订阅者接收区块数据所用的API地址
            // 订阅者需自行实现该API，本程序将使用POST方法向该API发送application/json类型的请求，请求体即是推送的区块数据(结构可参考下面对alterBlock配置项的说明)
            // 订阅者可根据自己的业务需求处理接收到的区块数据
            url: "http://localhost:9000/blocks",

            // 订阅者接收区块API需要验证客户端身份时的所需信息
            auth: {
                // 订阅者接收区块API需要登录验证身份时，使用的url、用户名及密码
                authUrl: "",
                userId: "",
                password: "",
                // 或者可直接使用token(将被放到HTTP Request Header的Authorization字段中)
                token: { type: "", value: "" },
            },
            // 定时检查并处理未推送成功的区块数据的时间间隔，默认为30s
            checkTimeInterval: 30000,
            // 订阅区块范围的下限，应为正整数，默认为1
            startingBlockHeight: 1,
            // 订阅区块范围的上限，为null或未定义时表示没有该限制
            endingBlockHeight: null,
            // 推送的区块数据是否不包含完整交易数据(交易数据只给出Id)，默认为false(给出完整交易数据)，为true时交易数据只含有交易Id
            lite: false,
            // 推送区块给订阅者时的超时设置，默认为5s
            timeout: 5000,

            /* 判断向订阅者接收区块API推送区块数据是否成功的方法，
            *  本程序将按照区块高度顺序推送，故若某一区块推送不成功，将会不断尝试推送该未成功的区块
            *  本方法的参数res是HTTP Response对象，
            *  返回值为一个数组，第一个元素为布尔值表示推送成功与否，第二个元素为失败时的解释信息(当第一个元素为false时才有效)
            *  返回值也可为Promise<[Boolean, String]>
            *  默认HTTP Response状态码为200即视为推送投递成功
            */
            deliverySuccess: (res) => [res.status === 200, res.statusText],

            /* 判断调用订阅者接收区块API时是否没有通过身份验证的方法
            *  本方法参数res是HTTP Response对象，
            *  返回Boolean或Promise<Boolean>
            *  默认HTTP Response状态码为401即视为未通过身份验证
            */
            isUnauthorized: (res) => res.status === 401,

            /* 登录订阅者的系统以验证身份的方法
            *  本程序默认订阅者系统基于OAuth2进行登录，返回token信息
            *  本方法参数authUrl为验证身份API地址,userId为用户标识，password为对应的密码，
            *  返回Promise<{type: <String>, value: <String>}>，若验证成功则返回获得的token信息，
            *  若失败则抛出异常
            *  默认无任何操作，需要使用者自己实现
            */
            signIn: (authUrl, userId, password) => Promise.resolve({ type: "", value: "" }),

            /* 调整欲推送的区块数据结构以满足订阅者API要求的方法
            *  默认推送的区块数据结构描述如下：
            *  - 完整区块：
            *  {
                  "BLOCKCHAIN": { // 区块所属链组网
                    "id": "credence-net"
                  },
                  "HEADER": { // 区块头信息
                    "COMMIT_FOR_TX": "", // 交易存在性证明
                    "TRANS_COUNT": 1,    // 区块所含交易数量
                    "COMMIT_FOR_GLOBAL_STATE": "", // 智能合约状态全局证明
                    "EXPIRED_HEIGHT": 0,           // 过期高度
                    "HEIGHT": 7,                   // 本区块高度
                    "FOLLOWING_BLOCK_HEADER": null, // 后续区块
                    "COMMIT_FOR_STATE": "",         // 智能合约状态块内证明
                    "COMMIT_FOR_TX_RESULT": "",     // 交易执行结果证明
                    "PRESENT_HASH": "MmM5NDNhMzk4ZmE5N2U5NzdjZTEyOGMxZjlkYzA1MmFhYmZlNGI5MzExN2Y4MzhlNmQ3NGFmZmE0MjczZDJhNw==", // 本区块哈希值(base64编码)
                    "ENDORSEMENTS": [ // 背书信息(节点对区块的认可证明)
                      {
                        "ACCOUNT_ID": "identity-net:921000006e0012v696", // 背书签名者账户标识
                        "CERT_ID": "identity-net:921000006e0012v696-COMBDELI-node5", // 背书签名者账户证书标识
                        "TIMESTAMP": "2022-07-01T11:50:19.842Z", // 背书签名时间
                        "SIGNATURE": "MEUCIHj9yBFe1qJC6RvsRaTC5IyW2jeRgusEwYcDraXYn0QZAiEApoTGHSlO/fTqIVfS9ovWE6Ma1VZzGCmb3G+NFWq2SOQ=" // 背书签名值(base64编码)
                      },
                      {
                        "ACCOUNT_ID": "identity-net:12110107bi45jh675g",
                        "CERT_ID": "identity-net:12110107bi45jh675g-COMBDELI-node2",
                        "TIMESTAMP": "2022-07-01T11:50:19.823Z",
                        "SIGNATURE": "MEYCIQCH/dykocP7UTmV+OKa4C9GQvgek2QlFaOZJbKbM56wIQIhAKqfftJlf6aT3s4XA9+bSZlDBvou/iW4nrb/hd91shrH"
                      },
                      {
                        "ACCOUNT_ID": "identity-net:122000002n00123567",
                        "CERT_ID": "identity-net:122000002n00123567-COMBDELI-node3",
                        "TIMESTAMP": "2022-07-01T11:50:19.819Z",
                        "SIGNATURE": "MEUCIDeRI6ZR7lgabC15fR6LBBro1QQOrs8GjGogzhjtoAT2AiEAsoVjjO1EdHq1OfpxL9ImVc3shgouOAx3MySR885sX2w="
                      },
                      {
                        "ACCOUNT_ID": "identity-net:921000005k36123789",
                        "CERT_ID": "identity-net:921000005k36123789-COMBDELI-node4",
                        "TIMESTAMP": "2022-07-01T11:50:19.804Z",
                        "SIGNATURE": "MEUCIQCobBTQ6rRDcymZiDi0/bA9KK9PKS0qy2tqZm+b95XfVAIgOFZzQbjfVFprgkg3w7XtpXEjtNScajpcYw06kVLH2XE="
                      }
                    ],
                    "TIMESTAMP": "2022-07-01T11:50:19.842Z", // 本区块被确认时间
                    "PREVIOUS_BLOCK_HEADER": { // 前序区块信息
                      "PRESENT_HASH": "OTUyNWUxYzI1YTJlMzcyZmJkNWI0ZWI0YWI1NDcwOTBhMGVkMGU2MGZkMzQ3YTlhOGMyMDU3MDE2M2M0MTk0NA==" // 前序区块哈希值(base64编码)
                    }
                  },
                  "TRANSACTIONS": [ // 交易信息
                    {
                      "ORDER_IN_BLOCK": 1, // 本交易在区块中的排序
                      "CHAINCODE_INVOKE_PARAMS": { // 调用合约交易参数
                        "function": "creProof", // 调用的合约方法名
                        "args": [ // 调用合约方法参数
                          "{\"uuid\":\"123\",\"data\":\"{\\\"id\\\":\\\"123456\\\", \\\"xyz\\\": \\\"test\\\"}\"}"
                        ]
                      },
                      "OID": "", // 调用的合约实例标识
                      "TXID": "a8bfe2854f384ae2025d66cb7856979b6e9d83b71f9fa0e27a5993b25b4bd4b9", // 交易唯一标识
                      "GAS_LIMIT": 0, // 执行交易的资源消耗上限
                      "CHAINCODE_SET_STATE_PARAMS": null, // 更新合约有效性状态交易参数（只有当交易类型TYPE为CHAINCODE_SET_STATE时才有值）
                      "SIGNATURE": { // 签名信息
                        "ACCOUNT_ID": "identity-net:951002007l78123233", // 签名账户标识
                        "CERT_ID": "identity-net:951002007l78123233-COMBDELI-super_admin", // 签名账户证书标识
                        "TIMESTAMP": "2022-07-01T12:32:16.473Z", // 签名之间
                        "SIGNATURE": "MEQCIGtLOarqf259kfBHSac6gYVNm/VE0qe+qdI6GSfygKLKAiBrC8wtt3WOEhHANOB9eZhYnvWrq3DkN87ylNXyjjuNuA==" // 签名值(base64编码)
                      },
                      "TIMESTAMP": "2022-07-01T12:32:16.473Z", // 交易生成时间
                      "CHAINCODE": { // 交易所涉及智能合约信息
                        "NAME": "CredenceTPL", // 智能合约名称
                        "VERSION": 1 // 智能合约版本
                      },
                      "TRANSACTION_RESULT": { // 交易执行结果
                        "CODE": 0, // 执行结果代码
                        "REASON": "", // 出错信息
                        "SUCCESS": true // 执行成功与否
                      },
                      "TYPE": "CHAINCODE_INVOKE", // 交易类型(调用合约交易CHAINCODE_INVOKE、部署合约交易CHAINCODE_DEPLOY以及更改合约有效性状态交易CHAINCODE_SET_STATE)
                      "CHAINCODE_DEPLOY_PARAMS": null // 部署合约交易参数（只有当交易类型TYPE为CHAINCODE_DEPLOY时才有值）
                    }
                  ],
                  "SUPERVISION_TX": null // 监管交易(若有值，则其结构与上述一般交易相同)
                }
            * 
            *  - 轻区块(lite为true时):
            *    与完整区块不同之处在于其transactions的元素中只含有txid
            *    {
            *       ...
            *       transactions: [{
            *           txid: <String>, 
            *       }, ...]
            *       ...
            *    }
            */
            alterBlock: (block) => block,
            /* 使alterBlock方法返回null，将会跳过相应区块数据，处理后续区块，可基于此过滤区块
            * 如:
            * alterBlock: (block) => { 
            *   // someFilter需要你自己实现
            *   if (!someFilter(block)) return null; 
            *   return block;
            * }
            */

        }
    ],

    // 日志相关配置
    Log: {
        repchainSynchronizerLogPath: "logs/repchainSynchronizer.log", // 同步区块链数据的过程的日志
        courierLogPath: "logs/courier.log", // 推送区块数据的过程的日志
    }
}
